#ifndef _VISITOR_H_
#define _VISITOR_H_
#include <QList>
#include "ast/VisitorBase.h"
#include "SimpleNode.h"
#include "ast/Suite.h"

class Visitor: public VisitorBase
{
public:
    virtual void traverse(const SimpleNodePtr& node)
    {
        node->traverse(this);
    }

    void visit(const QList<SimpleNodePtr>& nodes)
    {
        foreach(SimpleNodePtr node, nodes)
            visit(node);
    }

    ObjectPtr visit(const SimpleNodePtr& node)
    {
        open_level(node);
        ObjectPtr ret = node->accept(this, node);
        close_level(node);
        return ret;
    }

protected:
    virtual void unhandled_node(const SimpleNodePtr& node)
    {
    }

    void open_level(const SimpleNodePtr& node)
    {
    }

    void close_level(const SimpleNodePtr& node)
    {
    }

};

#endif
